#ifndef KPEXTOPIMGCMAPF32C1TOU8C4_H
#define KPEXTOPIMGCMAPF32C1TOU8C4_H

#include "kpextVkContext.h"
#include "kpextBaseCompute.h"

namespace kpext {

/**
 * @brief 单通道32位单精度浮点数图像颜色映射到4通道8位无符号数图像(小端模式)
 */
class OpImgCMapF32C1U8C4 : public BaseCompute{
public:
    explicit OpImgCMapF32C1U8C4(kpextVkContext * ctx);

    virtual ~OpImgCMapF32C1U8C4() override;


    /**
     * @brief 获取颜色映射数组的幅本， 幅本的内存由调用方释放
     * @param idx 颜色映射索引号
     * @return 成功返回颜色映射数组的幅本内存，否则返回空指针
     */
    static std::shared_ptr<float> getColorMapClone(uint32_t idx);


    /**
     * @brief 设置指定索引的颜色映射数组的数据; 由一到多组{input, r,g,b,a}数据结构组成
     * @param idx  指定索引的颜色映射
     * @param mapdata 由多组{input, r,g,b,a}数据结构组成
     *                 列如四个映射  {0, 0,0,0,255},       //映射源最小值为0
     *                      {100, 111,112,113,255},
     *                      {200, 221,222,223,255},
     *                      {255, 10,11,12,255},    //映射源最大值为255
     *
     */
    static void setColorMap(uint32_t idx, const std::vector<float> & mapdata);

    /**
     * @brief  重新构建计算管线及相关资源
     * @param cols  输入二维图像的列数
     * @param rows  输入二维图像的行数
     * @param cmap  颜色映射数组索引
     * @param inbuf  输入缓冲
     * @param outbuf  输出缓冲
     * @param cmdbuf 用于内部数据初始化操作的命令缓冲
     */
    virtual void rebuild(int cols,
                         int rows,
                         uint32_t cmap,
                         std::shared_ptr<BaseBuffer> inbuf,
                         std::shared_ptr<BaseBuffer> outbuf,
                         std::shared_ptr<CommandBuffer> cmdbuf
                         );

    /**
     * @brief 刷新颜色缓冲数据到vulkan设备内存
     * @param cmdbuf 用于内部数据初始化操作的命令缓冲
     */
    virtual void refreshColorMap(std::shared_ptr<CommandBuffer> cmdbuf);

protected:

    /**
     * @brief 颜色映射数组数据访问互斥锁
     */
    static std::mutex m_CMapsMutex;

    /**
     * @brief 多组颜色映射数组数据
     */
    static std::map<uint32_t, std::shared_ptr<float>> m_ColorMaps;

protected:

    /**
     * @brief 计算着色器的work group size
     */
    std::array<uint32_t, 3> m_workGroupSize;

    /**
     * @brief 当前正在使用的颜色映射数组索引号
     */
    uint32_t m_cmap_idx;

    /**
     * @brief 用于存放颜色映射数据的统一纹素缓冲
     */
    std::shared_ptr<UniformTexelBuffer> m_cmapBuf;

private:
    using BaseCompute::rebuild;

};  // class kpext::OpImgF32C1Transpose

} // namespace kpext

#endif // KPEXTOPIMGCMAPF32C1TOU8C4_H
